package com.example.lab.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.lab.entity.LabManagers;
import com.example.lab.result.PageResult;
import com.example.lab.result.Result;
import com.example.lab.service.ILabManagersService;
import com.example.lab.service.ILaboratoriesService;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Lazy;
import org.springframework.web.bind.annotation.*;

/**
 *@Author: 布莱恩
 *@Date: 2025/6/17 18:21
 *@Description:
 **/
@RestController
@RequestMapping("/api/lab-managers")
@RequiredArgsConstructor
public class LabManagerController {

    private final ILabManagersService labManagersService;
    private final ILaboratoriesService laboratoriesService;

    /**
     * 获取实验室管理员列表
     *
     * 此方法通过GET请求获取实验室管理员的信息列表可以根据实验室ID或学院ID进行筛选，
     * 并支持分页查询默认情况下，如果未指定页码和限制，将返回第1页的10条记录
     *
     * @param labId 实验室ID，可选参数如果不需要筛选，请留空
     * @param collegeId 学院ID，可选参数如果不需要筛选，请留空
     * @param page 页码，默认为1表示第1页
     * @param limit 每页记录数，默认为10表示每页显示10条记录
     * @return 返回包含实验室管理员列表的Result对象如果查询成功，Result对象将表示成功状态，
     *         否则可能表示错误状态
     */
    @GetMapping
    public Result<PageResult<LabManagers>> getLabManagers(
            @RequestParam(required = false) Integer labId,
            @RequestParam(required = false) Integer collegeId,
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer limit
    ) {
        PageResult<LabManagers> result = labManagersService.getLabManagers(labId, collegeId, page, limit);
        return Result.success(result);
    }


    /**
     * 分配实验室管理员
     *
     * 该方法通过POST请求接收LabManagers对象，尝试将指定的实验室管理员分配给某个实验室
     * 它首先调用LabManagersService中的assignLabManager方法尝试进行分配，如果分配成功，
     * 则返回成功信息和实验室管理员的ID；如果分配失败，则返回失败信息
     *
     * @param labManager 实验室管理员信息，包括需要分配的实验室信息和管理员信息
     * @return 分配结果如果分配成功，返回成功信息和实验室管理员ID；如果分配失败，返回失败信息
     */
    @PostMapping
    public Result<?> assignLabManager(@RequestBody LabManagers labManager) {

        // 检查实验室是否启用
        if (!laboratoriesService.isLaboratoryEnabled(labManager.getLabId())) {
            return Result.fail("实验室已禁用，不能分配管理员");
        }

        // 检查实验室是否已有管理员
        if (labManagersService.isLabAlreadyManaged(labManager.getLabId())) {
            return Result.fail("该实验室已分配管理员，不能重复分配");
        }

        boolean success = labManagersService.assignLabManager(labManager);
        if (success) {
            return Result.success(labManager.getId());
        }
        return Result.fail("分配实验室管理员失败");
    }

    /**
     * 通过DeleteMapping注解指定该方法处理HTTP DELETE请求，路径为"/{id}"，其中{id}是一个路径变量
     * 该方法的目的是根据提供的管理员ID从系统中移除实验室管理员
     *
     * @param id 要移除的实验室管理员的ID，作为一个路径变量传入
     * @return 返回一个Result对象，表示移除操作的结果如果移除成功，返回Result.success()；
     *         如果移除失败，返回Result.fail("移除实验室管理员失败")这说明了方法的返回类型和条件
     */
    @DeleteMapping("/{id}")
    public Result<?> removeLabManager(@PathVariable Integer id) {
        // 尝试从服务层移除指定ID的实验室管理员
        boolean success = labManagersService.removeLabManager(id);
        // 根据移除操作的结果，返回相应的结果对象
        if (success) {
            return Result.success();
        }
        return Result.fail("移除实验室管理员失败");
    }


}
